package com.hsjk.szwj.module.pay.controller.app.order.vo;

import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.hsjk.szwj.module.pay.constant.PayWayCodeConstant;
import com.hsjk.szwj.module.pay.dal.dataobject.config.AbstractMchAppReq;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.constraints.Range;
import org.springframework.beans.BeanUtils;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;

/**
 * @author chenjiawei
 * @desc
 * @Date 2023/08/23 18:29
 **/
@Data
public class UnifiedOrderReqVO extends AbstractMchAppReq {
    /**
     * 商户订单号
     **/
    @NotNull(message = "商户订单号不能为空")
    private Long mchOrderId;

    private Long payOrderId;

    /**
     * 支付方式  如： wxpay_jsapi,alipay_wap等
     **/
    @NotBlank(message = "支付方式不能为空")
    private String wayCode;

    /**
     * 支付金额， 单位：分
     **/
    @NotNull(message = "支付金额不能为空")
    @Min(value = 1, message = "支付金额不能为空")
    private Long amount;

    /**
     * 货币代码
     **/
    @NotBlank(message = "货币代码不能为空")
    private String currency;

    /**
     * 客户端IP地址
     **/
    private String clientIp;

    /**
     * 商品标题
     **/
    @NotBlank(message = "商品标题不能为空")
    private String subject;

    /**
     * 商品描述信息
     **/
    @NotBlank(message = "商品描述信息不能为空")
    private String body;

    /**
     * 异步通知地址
     **/
    private String notifyUrl;

    /**
     * 跳转通知地址
     **/
    private String returnUrl;

    /**
     * 订单失效时间, 单位：秒
     **/
    private LocalDateTime expiredTime;

    /**
     * 特定渠道发起额外参数
     **/
    private String channelExtra;

    /**
     * 商户扩展参数
     **/
    private String extParam;

    /**
     * 分账模式： 0-该笔订单不允许分账, 1-支付成功按配置自动完成分账, 2-商户手动分账(解冻商户金额)
     **/
    @Range(min = 0, max = 2, message = "分账模式设置值有误")
    private Integer divisionMode;

    /**
     * 返回真实的bizRQ
     **/
    public UnifiedOrderReqVO buildBizRQ() {

        if (PayWayCodeConstant.WX_JSAPI.equals(wayCode)) {
            WxJsapiOrderReqVO bizRQ = JSONObject.parseObject(StringUtils.defaultIfEmpty(this.channelExtra, "{}"),
                    WxJsapiOrderReqVO.class);
            BeanUtils.copyProperties(this, bizRQ);
            return bizRQ;
        } else if (PayWayCodeConstant.WX_LITE.equals(wayCode)) {
            WxLiteOrderReqVO bizRQ = JSONObject.parseObject(StringUtils.defaultIfEmpty(this.channelExtra, "{}"),
                    WxLiteOrderReqVO.class);
            BeanUtils.copyProperties(this, bizRQ);
            return bizRQ;
        } else if (PayWayCodeConstant.WX_BAR.equals(wayCode)) {
            WxBarOrderReqVO bizRQ = JSONObject.parseObject(StringUtils.defaultIfEmpty(this.channelExtra, "{}"),
                    WxBarOrderReqVO.class);
            BeanUtils.copyProperties(this, bizRQ);
            return bizRQ;
        } else if (PayWayCodeConstant.WX_NATIVE.equals(wayCode)) {
            WxNativeOrderReqVO bizRQ = JSONUtil.toBean(StringUtils.defaultIfEmpty(this.channelExtra, "{}"),
                    WxNativeOrderReqVO.class);
            BeanUtils.copyProperties(this, bizRQ);
            return bizRQ;
        } else if (PayWayCodeConstant.WX_H5.equals(wayCode)) {
            WxH5OrderReqVO bizRQ = JSONObject.parseObject(StringUtils.defaultIfEmpty(this.channelExtra, "{}"),
                    WxH5OrderReqVO.class);
            BeanUtils.copyProperties(this, bizRQ);
            return bizRQ;
        }

        return this;
    }

    /**
     * 获取渠道用户ID
     **/
    public String getChannelUserId() {
        return null;
    }
}
